public class ThreeStepsProblem {
    public int waysToStep(int n) {
        // 1e9 + 7 就是 1000000007, 这个模数经常用于避免int类型的溢出问题
        int MOD = (int)1e9 + 7;

        // 需要对 n <= 3 的情况进行特殊判定, 避免越界问题(处理边界情况)
        if(n == 1 || n == 2) {
            return n;
        }
        if(n == 3) {
            return 4;
        }
        // 1.构造dp表(n个台阶,但是下标从1开始,因此数组大小为 n+1)
        // 注意!!! 和运算一定要注意溢出问题!!!
        int[] dp = new int[n+1];

        // 2.初始化. 防止 dp表 越界问题
        dp[1] = 1;
        dp[2] = 2;
        dp[3] = 4;

        // 3.通过状态转移方程来填 dp表
        for(int i = 4; i <= n; i++) {
            // 每次有 加运算, 都需要模上 MOD 值
            dp[i] = ((dp[i-1] + dp[i-2]) % MOD + dp[i-3]) % MOD;
        }

        // 4.返回结果值(根据题目要求, 需要对结果模1000000007)
        return dp[n];
    }
}
